package day05;

import java.util.InputMismatchException;
import java.util.Scanner;

/*
异常处理：try-catch-finally    throw、throws

     避免程序中断，给可能异常的代码加下异常处理。
 */
public class Demo04 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入两个数：");

        try {
            int a = scanner.nextInt(); // InputMismatchException
            int b = scanner.nextInt(); // 0
            System.out.println(a / b);
            System.out.println("计算结束。");
            // Exception 所有异常都是从这个类继承的。
        } catch (InputMismatchException e) {
            System.out.println("输入的参数不正确，请输入整数。");
        } catch (Exception e) { // 捕获的异常放到变量e中
            System.out.println(e.getMessage()); // 将异常的信息打印下来
        } finally {
            // 不论是否异常，都会执行。
            // 一般把一些环境清理，资源释放类的动作放finally中
            System.out.println("程序运行结束。");
        }

        // 空指针的异常：对象是空的，调用了成员方法。NullPointerException
        // 这类属于代码的问题，属于bug，不能用try-catch规避。
        Door door = null;
        if (door != null) { // 调用方法前先判空。
            door.open();
        }
    }
}


class Student {
    String name;
    char gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getGender() {
        return gender;
    }

    /*
    使用throw 抛出一个异常时，在方法的头部要声明抛出了一个异常。
        throw用在方法体中，抛出异常。
        throws用在方法头/声明部分，声明这个方法抛出了一个异常。
     */
    public void setGender(char gender) throws Exception{
        if(gender == '男' || gender == '女') {
            this.gender = gender;
        }else {
            throw new Exception("输入的参数不合法：性别必须为男或女");
        }
    }

    public static void main(String[] args) throws Exception {
        Student stu = new Student();
        // 如果一个方法抛出了异常，调用这个方法时
        // 两种处理方法：
        // 1. try-catch捕获异常
        // 2. 这个方法也声明抛出了一个异常。
        stu.setGender('男');
    }
}